Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/discovery/src/commonTest/kotlin/org/meshtastic/feature/discovery/DiscoveryHomeRestorerTest.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 33.09 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.discovery

Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787kotlinx.coroutines.CompletableDeferred
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.async
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.test.advanceTimeBy
Tff7b72import T7ee787kotlinx.coroutines.test.advanceUntilIdle
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.common.di.ApplicationCoroutineScope
Tff7b72import T7ee787org.meshtastic.core.database.dao.DiscoveryDao
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoverySessionEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoverySessionStatus
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.testing.FakeMeshPrefs
Tff7b72import T7ee787org.meshtastic.core.testing.FakeServiceRepository
Tff7b72import T7ee787org.meshtastic.proto.Channel
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNotSame
Tff7b72import T7ee787kotlin.test.assertSame
Tff7b72import T7ee787kotlin.test.assertTrue

Tff7b72class T56d364DiscoveryHomeRestorerTest Tb4b4b4{
Tff7b72private Tff7b72fun Td2a8ffapplicationScopeTb4b4b4(Te6edf3scopeTb4b4b4: Te6edf3CoroutineScopeTb4b4b4)Tb4b4b4: Te6edf3ApplicationCoroutineScope Tff7b72=
Tff7b72object Tb4b4b4: T56d364ApplicationCoroutineScope Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3coroutineContext Tff7b72= Te6edf3scopeTb4b4b4.Te6edf3coroutineContext
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsupersededRestoreReturnsFalseToForegroundWaiterWithoutCancellingItTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3firstDevice Tff7b72= Ta5d6ff"Ta5d6ffx:FIRSTTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3firstDeviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3appScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3mockTff7b72<Te6edf3DiscoveryDaoTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)Tb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3appScopeTb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3firstDeviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3foregroundWaiter Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3restorerTb4b4b4.Te6edf3awaitForegroundTb4b4b4(Te6edf3planTb4b4b4) Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3foregroundWaiterTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffthe restore should be waiting for the disconnected deviceTa5d6ff"Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3restorerTb4b4b4.Te6edf3awaitBeforeScanTb4b4b4(Ta5d6ff"Ta5d6ffx:SECONDTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffa different device may proceed after superseding the restoreTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(
Te6edf3foregroundWaiterTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsuperseding a restore must return false instead of cancelling its waiterTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffselectedDeviceChangeWakesDisconnectedRestoreWaiterTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:FIRSTTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3mockTff7b72<Te6edf3DiscoveryDaoTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)Tb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)

Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Ta5d6ff"Ta5d6ffx:SECONDTa5d6ff"Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8fffinalStatusMappingPreservesTerminalIntentAndDefaultsRecoveredStatesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3STOPPEDTb4b4b4,
Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_STOPPEDTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4,
Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_FAILEDTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTOREDTb4b4b4, Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3IN_PROGRESSTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTOREDTb4b4b4, Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3INTERRUPTEDTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4,
Te6edf3finalStatusForPendingRestoreTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3INTERRUPTEDTb4b4b4, Te6edf3default Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrepeatedScheduleForSameActiveSessionIsIdempotentTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:SAMETa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3appScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3mockTff7b72<Te6edf3DiscoveryDaoTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)Tb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3appScopeTb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= T79c0ff7LTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3first Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)

Te6edf3assertSameTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Te6edf3firstTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffschedulingDifferentSessionCancelsAndReplacesPendingRestoreTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:SUPERSEDETa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3mockTff7b72<Te6edf3DiscoveryDaoTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)Tb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3firstPlan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3first Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3firstPlanTb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3firstPlanTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3sessionId Tff7b72= T79c0ff2LTb4b4b4)Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3firstTb4b4b4.Te6edf3isCancelledTb4b4b4, Ta5d6ff"Ta5d6ffthe superseded session must release its restore ownershipTa5d6ff"Tb4b4b4)
Te6edf3assertNotSameTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Te6edf3secondTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffsameSessionIdOnDifferentDeviceReplacesPendingRestoreTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3firstDevice Tff7b72= Ta5d6ff"Ta5d6ffx:FIRSTTa5d6ff"
Tff7b72val Te6edf3secondDevice Tff7b72= Ta5d6ff"Ta5d6ffx:SECONDTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3firstDeviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3mockTff7b72<Te6edf3DiscoveryDaoTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)Tb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3firstPlan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= T79c0ff7LTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3firstDeviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3first Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3firstPlanTb4b4b4)
Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Te6edf3secondDeviceTb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3firstPlanTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3deviceAddress Tff7b72= Te6edf3secondDeviceTb4b4b4)Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3firstTb4b4b4.Te6edf3isCancelledTb4b4b4, Ta5d6ff"Ta5d6ffa reused database row id must not retain the previous radio's ownershipTa5d6ff"Tb4b4b4)
Te6edf3assertNotSameTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Te6edf3secondTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffinterruptedRecoverySwitchesActiveWatcherToNewlySelectedDeviceTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3firstDevice Tff7b72= Ta5d6ff"Ta5d6ffx:FIRSTTa5d6ff"
Tff7b72val Te6edf3secondDevice Tff7b72= Ta5d6ff"Ta5d6ffx:SECONDTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3firstDeviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Te6edf3listOfTb4b4b4(Te6edf3firstDevice Te6edf3to Ta5d6ff"Ta5d6ffFIRST_HOMETa5d6ff"Tb4b4b4, Te6edf3secondDevice Te6edf3to Ta5d6ff"Ta5d6ffSECOND_HOMETa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Tb4b4b4(Te6edf3deviceTb4b4b4, Te6edf3homePresetTb4b4b4) Tff7b72-Tff7b72>
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffSHORT_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Te6edf3homePresetTb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3INTERRUPTEDTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3firstRestore Tff7b72= Te6edf3CompletableDeferredTff7b72<Tffa657BooleanTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3scheduledDevices Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3recovery Tff7b72=
Te6edf3DiscoveryInterruptedSessionRecoveryTb4b4b4(
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Te6edf3isScanActive Tff7b72= Tb4b4b4{ Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3scheduleRestoreIfIdle Tff7b72= Tb4b4b4{ Te6edf3session Tff7b72-Tff7b72>
Te6edf3scheduledDevices Tff7b72+Tff7b72= Te6edf3checkNotNullTb4b4b4(Te6edf3sessionTb4b4b4.Te6edf3deviceAddressTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3sessionTb4b4b4.Te6edf3deviceAddress Tff7b72=Tff7b72= Te6edf3firstDeviceTb4b4b4) Te6edf3firstRestore Tff7b72else Te6edf3CompletableDeferredTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restoredPresets Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3watcher Tff7b72= Te6edf3launch Tb4b4b4{ Te6edf3recoveryTb4b4b4.Te6edf3watch Tb4b4b4{ Te6edf3restoredPresets Tff7b72+Tff7b72= Tffa657it Tb4b4b4} Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3meshPrefsTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Te6edf3secondDeviceTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3firstDeviceTb4b4b4, Te6edf3secondDeviceTb4b4b4)Tb4b4b4, Te6edf3scheduledDevicesTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffSECOND_HOMETa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3restoredPresetsTb4b4b4)
Te6edf3watcherTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3firstRestoreTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffdiscoveryTestRadioControllerRejectsStaleDeviceBeforeWritingTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3selectedDeviceAddress Tff7b72= Ta5d6ff"Ta5d6ffx:CURRENTTa5d6ff" Tb4b4b4}

Tff7b72val Te6edf3restored Tff7b72=
Te6edf3radioControllerTb4b4b4.Te6edf3restoreLocalConfigurationTb4b4b4(
Te6edf3expectedDeviceAddress Tff7b72= Ta5d6ff"Ta5d6ffx:STALETa5d6ff"Tb4b4b4,
Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3restoredTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3channelWritesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffunsatisfiablePrimaryChannelRestoreStopsWithoutRetryingTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:INVALIDTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_FAILEDTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffan invalid restore plan must terminate without entering the retry loopTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3UNRESTORABLETb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3restorerTb4b4b4.Te6edf3hasUnsatisfiedRestoreForTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8fftransientWriteFailuresRetryWithBackoffWhileTheSameDeviceRemainsConnectedTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:RETRYTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3failLocalConfigWritesRemaining Tff7b72= T79c0ff2
Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3sizeTb4b4b4)

Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3sizeTb4b4b4, Ta5d6ff"Ta5d6ffthe second retry must use exponential backoffTa5d6ff"Tb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3POST_RESTORE_SETTLE_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffupdateFinalStatusChangesAndCorrectsTheTerminalStatusPublishedByARestoreTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:STATUSTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72= Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3plan Tff7b72=
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72= Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(Te6edf3planTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3restorerTb4b4b4.Te6edf3updateFinalStatusTb4b4b4(Te6edf3sessionIdTb4b4b4, Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3POST_RESTORE_SETTLE_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)

Te6edf3restorerTb4b4b4.Te6edf3updateFinalStatusTb4b4b4(Te6edf3sessionIdTb4b4b4, Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3STOPPEDTb4b4b4)

Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3STOPPEDTb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffownershipRejectionDoesNotConsumeTheRestoreRetryBudgetTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:OWNERSHIP-LAGTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3acceptConditionalRestore Tff7b72= Tff7b72false
Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72=
Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MS Tff7b72* Tb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RESTORE_ATTEMPTS Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffownership rejection must remain recoverableTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3localConfigWriteAttemptsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4,
Tb4b4b4)

Te6edf3radioControllerTb4b4b4.Te6edf3acceptConditionalRestore Tff7b72= Tff7b72true
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3POST_RESTORE_SETTLE_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffpersistentOwnershipRejectionStopsWithoutMarkingTheSessionUnrestorableTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:OWNERSHIP-STUCKTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3acceptConditionalRestore Tff7b72= Tff7b72false
Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72=
Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3advanceUntilIdleTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffpersistent ownership rejection must not leave an unbounded retry taskTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3localConfigWriteAttemptsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4,
Ta5d6ff"Ta5d6ffownership rejection must stay recoverable instead of consuming the radio-write failure budgetTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8fftransientDisconnectFailuresDoNotConsumeTheActiveRetryBudgetTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:DISCONNECT-RETRYTa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3failLocalConfigWritesRemaining Tff7b72= Tffa657IntTb4b4b4.Te6edf3MAX_VALUE
Te6edf3onLocalConfigWriteAttempt Tff7b72= Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72=
Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3repeatTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RESTORE_ATTEMPTS Tff7b72+ T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffdisconnect failures must remain recoverableTa5d6ff"Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_COMPLETETb4b4b4,
Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4,
Tb4b4b4)
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3radioControllerTb4b4b4.Te6edf3failLocalConfigWritesRemaining Tff7b72= T79c0ff0
Te6edf3radioControllerTb4b4b4.Te6edf3onLocalConfigWriteAttempt Tff7b72= Tff7b72null
Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3advanceTimeByTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3POST_RESTORE_SETTLE_DELAY_MSTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3COMPLETETb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffpermanentWriteFailureStopsAfterBoundedAttemptsAndMarksSessionUnrestorableTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:UNRESTORABLETa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3failLocalConfigWritesRemaining Tff7b72= Tffa657IntTb4b4b4.Te6edf3MAX_VALUE
Tb4b4b4}
Tff7b72val Te6edf3discoveryDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3discoveryDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_FAILEDTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72=
Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72var Te6edf3retryWindowMs Tff7b72= T79c0ff0L
Tff7b72var Te6edf3retryDelayMs Tff7b72= Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MS
Te6edf3repeatTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RESTORE_ATTEMPTS Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3retryWindowMs Tff7b72+Tff7b72= Te6edf3retryDelayMs
Te6edf3retryDelayMs Tff7b72=
Tb4b4b4(Te6edf3retryDelayMs Tff7b72* Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_BACKOFF_MULTIPLIERTb4b4b4)Tb4b4b4.Te6edf3coerceAtMostTb4b4b4(
Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RETRY_DELAY_MSTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3advanceTimeByTb4b4b4(Te6edf3retryWindowMsTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RESTORE_ATTEMPTSTb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3localConfigWriteAttemptsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3UNRESTORABLETb4b4b4, Te6edf3discoveryDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3restorerTb4b4b4.Te6edf3hasUnsatisfiedRestoreForTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(
Te6edf3restorerTb4b4b4.Te6edf3awaitBeforeScanTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffa durably unrestorable restore must not leave a process-lifetime same-device admission barrierTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffunrestorablePersistenceFailureKeepsSameDeviceBarrierRecoverableTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3device Tff7b72= Ta5d6ff"Ta5d6ffx:UNRESTORABLE-PERSISTENCETa5d6ff"
Tff7b72val Te6edf3meshPrefs Tff7b72= Te6edf3FakeMeshPrefsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setDeviceAddressTb4b4b4(Te6edf3deviceTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3serviceRepository Tff7b72= Te6edf3FakeServiceRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3radioController Tff7b72=
Te6edf3DiscoveryTestRadioControllerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3selectedDeviceAddress Tff7b72= Te6edf3device
Te6edf3failLocalConfigWritesRemaining Tff7b72= Tffa657IntTb4b4b4.Te6edf3MAX_VALUE
Tb4b4b4}
Tff7b72val Te6edf3backingDao Tff7b72= Te6edf3SharedInMemoryDiscoveryDaoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loraConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3sessionId Tff7b72=
Te6edf3backingDaoTb4b4b4.Te6edf3insertSessionTb4b4b4(
Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3timestamp Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLONG_FASTTa5d6ff"Tb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_FAILEDTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3homeLoraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3discoveryDao Tff7b72=
Tff7b72object Tb4b4b4: T56d364DiscoveryDao Tff7b72by Te6edf3backingDao Tb4b4b4{
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateRecoverableSessionCompletionStatusTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4, Te6edf3statusTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72= T79c0ff0
Tb4b4b4}
Tff7b72val Te6edf3restorer Tff7b72=
Te6edf3DiscoveryHomeRestorerTb4b4b4(
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3serviceRepository Tff7b72= Te6edf3serviceRepositoryTb4b4b4,
Te6edf3discoveryDao Tff7b72= Te6edf3discoveryDaoTb4b4b4,
Te6edf3applicationScope Tff7b72= Te6edf3applicationScopeTb4b4b4(Te6edf3backgroundScopeTb4b4b4)Tb4b4b4,
Te6edf3meshPrefs Tff7b72= Te6edf3meshPrefsTb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72=
Te6edf3restorerTb4b4b4.Te6edf3scheduleTb4b4b4(
Te6edf3DiscoveryHomeRestorePlanTb4b4b4(
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3deviceTb4b4b4,
Te6edf3loraConfig Tff7b72= Te6edf3loraConfigTb4b4b4,
Te6edf3primaryChannel Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3restorePrimaryChannel Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3finalStatus Tff7b72= Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3FAILEDTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72var Te6edf3retryWindowMs Tff7b72= T79c0ff0L
Tff7b72var Te6edf3retryDelayMs Tff7b72= Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_DELAY_MS
Te6edf3repeatTb4b4b4(Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RESTORE_ATTEMPTS Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3retryWindowMs Tff7b72+Tff7b72= Te6edf3retryDelayMs
Te6edf3retryDelayMs Tff7b72=
Tb4b4b4(Te6edf3retryDelayMs Tff7b72* Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3RETRY_BACKOFF_MULTIPLIERTb4b4b4)Tb4b4b4.Te6edf3coerceAtMostTb4b4b4(
Te6edf3DiscoveryHomeRestorerTb4b4b4.Te6edf3MAX_RETRY_DELAY_MSTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3advanceTimeByTb4b4b4(Te6edf3retryWindowMsTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3DiscoverySessionStatusTb4b4b4.Te6edf3RESTORE_PENDING_FAILEDTb4b4b4, Te6edf3backingDaoTb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4)Tff7b72?.Te6edf3completionStatusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3restorerTb4b4b4.Te6edf3hasUnsatisfiedRestoreForTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(
Te6edf3restorerTb4b4b4.Te6edf3awaitBeforeScanTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffa failed terminal-status write must keep the recoverable same-device barrierTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.17s